#include "hal.h"

void hal_gpio_set_out(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    // 端口配置结构
    stc_gpio_cfg_t pstcGpioCfg;
		Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    pstcGpioCfg.enDir = GpioDirOut;                     // 输出
    pstcGpioCfg.enDrv = GpioDrvH;                       // 高驱动
    pstcGpioCfg.enPu = GpioPuDisable;                   // 禁用上拉
    pstcGpioCfg.enPd = GpioPdDisable;                   // 禁用下拉
    pstcGpioCfg.enOD = GpioOdDisable;                   // 禁用开漏
    
    Gpio_Init(enPort, enPin, &pstcGpioCfg);
}

void hal_gpio_set_out_l(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    // 端口配置结构
    stc_gpio_cfg_t pstcGpioCfg;
		Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    pstcGpioCfg.enDir = GpioDirOut;                     // 输出
    pstcGpioCfg.enDrv = GpioDrvL;                       // 低驱动
    pstcGpioCfg.enPu = GpioPuDisable;                   // 禁用上拉
    pstcGpioCfg.enPd = GpioPdDisable;                   // 禁用下拉
    pstcGpioCfg.enOD = GpioOdDisable;                   // 禁用开漏
    
    Gpio_Init(enPort, enPin, &pstcGpioCfg);
}
void hal_gpio_set_in(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    // 端口配置结构
    stc_gpio_cfg_t pstcGpioCfg;
		Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    pstcGpioCfg.enDir = GpioDirIn;                      // 输入
    pstcGpioCfg.enDrv = GpioDrvH;                       // 高驱动
    pstcGpioCfg.enPu = GpioPuDisable;                   // 禁用上拉
    pstcGpioCfg.enPd = GpioPdDisable;                   // 禁用下拉
    pstcGpioCfg.enOD = GpioOdDisable;                   // 禁用开漏
    
    Gpio_Init(enPort, enPin, &pstcGpioCfg);
}

void hal_gpio_set_od_out(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    // 端口配置结构
    stc_gpio_cfg_t pstcGpioCfg;
		Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    pstcGpioCfg.enDir = GpioDirOut;                     // 输出
    pstcGpioCfg.enDrv = GpioDrvH;                       // 高驱动
    pstcGpioCfg.enPu = GpioPuDisable;                   // 禁用上拉
    pstcGpioCfg.enPd = GpioPdDisable;                   // 禁用下拉
    pstcGpioCfg.enOD = GpioOdEnable;                    // 开漏
    
    Gpio_Init(enPort, enPin, &pstcGpioCfg);
}

void hal_gpio_set_pullup(en_gpio_port_t enPort, en_gpio_pin_t enPin, boolean_t on)
{
    //配置为默认值,GPIO功能
    SetBit((uint32_t)&M0P_GPIO->PAADS + enPort, enPin, FALSE);
    *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = GpioAf0;

    //上拉/下拉配置
    SetBit(((uint32_t)&M0P_GPIO->PAPU + enPort), enPin, on);
}

void hal_gpio_set_pulldown(en_gpio_port_t enPort, en_gpio_pin_t enPin, boolean_t on)
{
    //配置为默认值,GPIO功能
    SetBit((uint32_t)&M0P_GPIO->PAADS + enPort, enPin, FALSE);
    *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = GpioAf0;

    //上拉/下拉配置
    SetBit(((uint32_t)&M0P_GPIO->PAPD + enPort), enPin, on);
}

void hal_gpio_enable_int(en_gpio_port_t enPort, en_gpio_pin_t enPin,
                         en_gpio_irqtype_t irqtype)
{
    ///< 打开并配置USER KEY为下降沿中断
    Gpio_EnableIrq(enPort, enPin, irqtype);
    
    ///< 使能端口PORTA系统中断
    EnableNvic(PORTA_IRQn, IrqLevel3, TRUE);
}

void hal_gpio_disable_int(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    ///< 使能端口PORTA系统中断
    EnableNvic(PORTA_IRQn, IrqLevel3, FALSE);
}